home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / 8bit / cislib_b / qset.asm < prev    next >
Assembly Source File  |  1995-04-22  |  6KB  |  264 lines

  1.          .TITLE "PERCOM QUICK SET      05-27-85" 
  2. ;SAVE#D:QSET.M65 
  3. ; This program switches the density for 
  4. ; PERCOM compatible drives. 
  5. ; Drive numbers allowed are 1 through 8. 
  6. ; Allowed settings are: 
  7. ; S  = single 
  8. ; E  = enhanced (1050) 
  9. ; D  = double 
  10. ; DD = double sided, double density 
  11. ; Command format example: 
  12. ; QSET 1D 7E 3DD 
  13. ; At least one space after QSET is 
  14. ; required. The rest of the command line 
  15. ; ignores anything other than a number 
  16. ; in the range 1 through 8 followed by 
  17. ; an upper case D, E, or S. Thus, 
  18. ; equivalent examples are: 
  19. ; QSET 1D7E3DD 
  20. ; QSET 31DXYZ7E          3DD 
  21. ; When the program terminates, it echoes 
  22. ; to the screen the valid portions of 
  23. ; the command line. The last example 
  24. ; would echo: 
  25. ;  1D   7E          3DD 
  26. ; If a drive cannot be configured, the 
  27. ; last letter is replaced with a 
  28. ; question mark. 
  29. ;    NOTES: 
  30. ;    1. Enhanced (1050) allows 
  31. ;    you to read or write 1050 
  32. ;    density disks, but does 
  33. ;    not allow you to format 
  34. ;    disks in that density. 
  35. ;    2. As with any other SIO 
  36. ;    use, the 28 second timeout 
  37. ;    may occasionally occur. 
  38. ; I wish to credit DANIEL L. MOORE 
  39. ; for his SET.ASM, from which the 
  40. ; central routine of this program was 
  41. ; adapted. 
  42. ****************************** 
  43. *                            * 
  44. *  Josef W. Segur  05/27/85  * 
  45. *                            * 
  46. ****************************** 
  47. DOSVEC   =   $0A 
  48. DOSINIT  =   $07E0   FMS v. 2 
  49. FR0      =   $D4     FP register 0 
  50. DENSITY  =   FR0+2 
  51. ; OS/A+ equates 
  52. CPBUFP   =   $0A     next char. 
  53. CPCMDB   =   $3F     command buff. 
  54. ; SIO equates 
  55. DDEVIC   =   $0300 
  56. DUNIT    =   $0301 
  57. DCOMND   =   $0302 
  58. DSTATS   =   $0303 
  59. DBUFLO   =   $0304 
  60. DBYTLO   =   $0308 
  61. ; Data direction control 
  62. IN       =   $40 
  63. OUT      =   $80 
  64. ; CIO equates 
  65. ICHID    =   $0340 
  66. ICCOM    =   $0342 
  67. ICBAL    =   $0344 
  68. ICBAH    =   $0345 
  69. ICBLL    =   $0348 
  70. ICBLH    =   $0349 
  71. PUTBYTS  =   $0B 
  72. ; PERCOM drive table 
  73. READ     =   $4E 
  74. WRITE    =   $4F 
  75. LENGTH   =   12 
  76. FM       =   0       FM recording 
  77. MFM      =   4       MFM recording 
  78. SID1     =   0       One side 
  79. SID2     =   1       Two sides 
  80. CIO      =   $E456 
  81. SIO      =   $E459 
  82. EOL      =   $9B     End of line char. 
  83.          *=  $4000 
  84. START    CLC  
  85.          LDY #CPBUFP 
  86.          LDA (DOSVEC),Y 
  87.          ADC #CPCMDB+1 ;skip 1st space 
  88.          STA CMDBIX 
  89.          STA FIRSTX 
  90.          SEC  
  91.          LDA # <EBUF 
  92.          SBC FIRSTX 
  93.          STA FR0 
  94.          LDA # >EBUF 
  95.          SBC #0 
  96.          STA FR0+1 
  97.          LDA #EOL 
  98.          STA EBUF 
  99. LOOP     LDY CMDBIX 
  100.          INC CMDBIX 
  101.          BMI DOS     ;out if too long 
  102.          LDA (DOSVEC),Y ;Get char 
  103.          CMP #EOL 
  104.          BEQ DOS     ;out if end 
  105.          STA (FR0),Y ;save for echo? 
  106. ; Test for drive 1 to 8. 
  107.          EOR #'0 
  108.          CMP #$09 
  109.          BCC NUM     ;BR if 1 - 8 
  110. SPLP     LDA #32     ;Else space 
  111.          STA (FR0),Y 
  112.          JMP LOOP    ;and check next 
  113. NUM      STA DUNIT 
  114.          LDA #$31 
  115.          STA DDEVIC 
  116. ; Test for S(0), E(1), D(2), DD(3) 
  117.          LDX #0 
  118.          INY  
  119.          LDA (DOSVEC),Y 
  120.          CMP #EOL 
  121.          BEQ DOS     ;out if end 
  122.          CMP #'S 
  123.          BEQ SETIT 
  124.          INX  
  125.          CMP #'E 
  126.          BEQ SETIT 
  127.          INX  
  128.          CMP #'D 
  129.          BEQ SECD    ;Chk 2nd D 
  130.          DEY         ;letter bad 
  131.          BNE SPLP    ;clr number & next 
  132. SECD     STA (FR0),Y 
  133.          INY  
  134.          LDA (DOSVEC),Y 
  135.          CMP #'D 
  136.          BEQ DDYS 
  137.          DEY         ;whoops 
  138.          LDA #'D 
  139.          BNE SETIT 
  140. DDYS     INX  
  141.          BNE SETIT 
  142. DOS      LDA #EOL 
  143.          STA (FR0),Y 
  144.          STY CMDBIX 
  145.          JSR DOSINIT ;reinit for all changes 
  146.          LDA ICHID 
  147.          BMI DRTS    ;BR IOCB#0 not open 
  148.          LDA #PUTBYTS 
  149.          STA ICCOM   ;Else echo cmds 
  150.          LDA # <EBUF 
  151.          STA ICBAL   ;from EBUF 
  152.          LDA # >EBUF 
  153.          STA ICBAH 
  154.          LDX #0 
  155.          SEC  
  156.          LDA CMDBIX 
  157.          SBC FIRSTX 
  158.          STA ICBLL   ;len end - start 
  159.          STX ICBLH 
  160.          JSR CIO 
  161. DRTS     RTS  
  162. SETIT    STX DENSITY 
  163.          STA (FR0),Y ;save letter 
  164.          INY  
  165.          STY CMDBIX  ;& index past it 
  166. ; First read in the current 
  167. ; control table. 
  168.          LDA #IN 
  169.          STA DSTATS 
  170.          LDA #READ 
  171.          STA DCOMND 
  172.          LDA #LENGTH 
  173.          STA DBYTLO 
  174.          LDA #0 
  175.          STA DBYTLO+1 
  176.          LDA # <TABLE 
  177.          STA DBUFLO 
  178.          LDA # >TABLE 
  179.          STA DBUFLO+1 
  180.          JSR SIO 
  181.          BPL DENS    cont if no error 
  182.          LDY CMDBIX 
  183.          DEY  
  184.          LDA #'? 
  185.          STA (FR0),Y else insert ? 
  186.          JMP LOOP    and loop for more 
  187. ; Modify the control bytes 
  188. ; First recording technique 
  189. DENS     LDA DENSITY 
  190.          BNE SET.MFM 
  191.          LDX #FM 
  192.          BEQ SET 
  193. SET.MFM  LDX #MFM 
  194. SET      STX TABLE+5 
  195. ; Then set the sector length 
  196.          CMP #2 
  197.          BCS S.256 
  198.          LDX #$80    128 bytes 
  199.          LDY #$00 
  200.          BEQ SETLEN 
  201. S.256    LDX #$00    256 bytes 
  202.          LDY #$01 
  203. SETLEN   STY TABLE+6 High byte 
  204.          STX TABLE+7 Low byte 
  205. ; Then set the number of 
  206. ; sectors per track. 
  207.          CMP #1 
  208.          BEQ S.26 
  209.          LDX #18     18 sectors 
  210.          BNE SETSECT 
  211. S.26     LDX #26     26 sectors 
  212. SETSECT  STX TABLE+3 
  213. ; Set the number of sides 
  214.          CMP #3 
  215.          BEQ S.DBL 
  216.          LDX #SID1 
  217.          BEQ SETSID 
  218. S.DBL    LDX #SID2 
  219. SETSID   STX TABLE+4 
  220. ; Then write the table out. 
  221.          LDA #OUT 
  222.          STA DSTATS 
  223.          LDA #WRITE 
  224.          STA DCOMND 
  225.          JSR SIO 
  226. ; Loop for any more requests 
  227.          JMP LOOP 
  228. CMDBIX   =   *       ;reserve index byte store 
  229.          *=  *+1 
  230. FIRSTX   =   *       ;reserve start index store 
  231.          *=  *+1 
  232. ; DRIVE table. 
  233. TABLE    =   * 
  234.          *=  *+LENGTH 
  235. EBUF     =   * 
  236.          *=  *+128   ;reserve 
  237. END      .OPT LIST 
  238. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^